package com.reflection.question;

import com.fxh.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 反射问题的引入
 * */
public class ReflectionQestion {
    public static void main(String[] args) throws IOException,
            ClassNotFoundException, NoSuchMethodException,
            InvocationTargetException, InstantiationException,
            IllegalAccessException {
        // 1、new Cat();
        Cat cat = new Cat();
        cat.hi();
        //根据配置文件，re.properties 指定信息，创建cat对象并调用方法hi

        //1、使用Properties 类，可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("reflection/src/re.properties"));
        String classPath = properties.get("classpath").toString();
        String method = properties.get("method").toString();
        System.out.println(classPath);
        System.out.println(method);

        //2、创建对象，传统的方法，行不通 =》反射机制
        // new classPath();

        //3、使用反射机制解决
        //（1）：加载类,返回Class类型的对象cls
        Class cls = Class.forName(classPath);
        //（2）：通过cls 得到加载类 com.fxh.Cat 的对象实例
        //java 1.9以后不推荐使用newInstance()
        Object o = cls.getDeclaredConstructor().newInstance();
        System.out.println("o的运行类型："+o.getClass());

        //(3):通过cls得到你加载的类 com.fxh.Cat 的methodName"hi"的方法对象
        //即：在反射中，可以把方法视为对象（万物既对象）
        Method method1 = cls.getMethod(method);
        //(4):通过method1 调用方法，即通过方法对象来调用方法
        System.out.println("===========================================");
        //传统方法，对象.方法(),反射机制方法  方法.invoke(对象)
        method1.invoke(o);







    }
}
